using System;
using System.Collections.Generic;
using System.Text;
using RC.ControlAcceso.BaseDatos;
using System.Data;
using RC.CodigoBarras.Utiles;
using RC.ControlAcceso.BaseDatos.GestionHorariaTableAdapters;
using System.Web.Caching;

namespace RC.ControlAcceso.ObjetosNegocio
{
    public class CA2Feriado
    {
        #region CACHE
        private static Cache _cache;
        /// <summary>
        /// Cache para todos los objetos de legajo
        /// </summary>
        private static Cache CacheCA
        {
            get
            {
                if (_cache == null)
                    _cache = System.Web.HttpRuntime.Cache;
                return _cache;
            }
            set
            {
                _cache = value;
            }
        }
        #endregion

        #region Variables
        private int _idFeriado;
        private DateTime _fecha;
        private string _motivo;
        private bool _EsFeriadoDoble;
        
        #endregion

        #region Propiedades
        
        public int IdFeriado
        {
            get { return _idFeriado; }
            set { _idFeriado = value; }
        }
        public DateTime Fecha
        {
            get { return _fecha; }
            set { _fecha = value; }
        }
        public String FechaString
        {
            get { return Fecha.ToString("dd/MM/yyyy"); }
        }
        public string Motivo
        {
            get { return _motivo; }
            set { _motivo = value; }
        }
        public bool EsFeriadoDoble
        {
            get { return _EsFeriadoDoble; }
            set { _EsFeriadoDoble = value; }
        }

       
        #endregion

        #region Constructores
        public CA2Feriado()
        {
            IdFeriado = -1;
            _fecha = CA2Parametros.FechaMinima;
            _motivo = "";
            EsFeriadoDoble = false;
        }        
        #endregion

        #region Funciones
        
        /// <summary>
        /// Agrega un Feriado.
        /// </summary>
        /// <returns>No devuelve nada.</returns>
        public void Insertar()
        {
            IdFeriado = InsertarDAL(Fecha, Motivo, EsFeriadoDoble).IdFeriado;
        }
        /// <summary>
        /// Actualiza el objeto.
        /// </summary>
        /// <returns>No devuelve nada.</returns>
        public void Actualizar()
        {
            ActualizarDAL(Motivo, Fecha, EsFeriadoDoble, IdFeriado);
        }
        public void Eliminar()
        {
            Eliminar(IdFeriado);            
        }
        public void Insertar(CA2Feriado pFeriado)
        {
            pFeriado.Insertar();
        }
        public void Actualizar(CA2Feriado pFeriado)
        {
            pFeriado.Actualizar();
        }
        public void Eliminar(CA2Feriado pFeriado)
        {
            pFeriado.Eliminar();
        }
        #endregion

        #region Interfase DAL
        //objeto de la capa DAL
        private static CAFeriadoTableAdapter _FeriadoAD;
        protected static CAFeriadoTableAdapter Adaptador
        {
            get
            {
                if (_FeriadoAD == null)
                    _FeriadoAD = new CAFeriadoTableAdapter();

                return _FeriadoAD;
            }
        }
        public static CA2Feriado ObtenerPorID(int pIDidFeriado)
        {

            /////////////////////////
            // Obtengo objeto desde el cache
            // Mantengo todos los feriados en el cache.
            CA2FeriadoColeccion _TodosLosFeriados = (CA2FeriadoColeccion)CacheCA["Feriados"]; // trato de obtenerlo del cache
            if (_TodosLosFeriados == null)
                _TodosLosFeriados = ObtenerTodosLosFeriados();

            foreach (CA2Feriado _feriado in _TodosLosFeriados)
                if (_feriado.IdFeriado == pIDidFeriado) 
                    return _feriado;
            // Fin obtener de cache
            ///////////////////////////////////
            
            return null;
        }
        protected static CA2Feriado AsignarRowAObjeto(GestionHoraria.CAFeriadoRow pRow)
        {
            CA2Feriado _Feriado = null;
            if (pRow != null)
            {
                _Feriado = new CA2Feriado();
                _Feriado.IdFeriado = pRow.IdFeriado;
                try { _Feriado.Motivo = pRow.Motivo; }
                catch { _Feriado.Motivo = ""; }
                try { _Feriado.Fecha = pRow.Dia; }
                catch { _Feriado.Fecha = CA2Parametros.FechaMinima; }
                _Feriado.EsFeriadoDoble = pRow.EsFeriadoDoble;
            }
            return _Feriado;
        }
        public CA2Feriado InsertarDAL(DateTime pFecha, string pMotivo, bool pEsFeriadoDoble)
        {
            IdFeriado = int.Parse(Adaptador.Insertar(pFecha, pMotivo, pEsFeriadoDoble).ToString());
            CacheCA.Remove("Feriados");
            return this;
        }
        public bool ActualizarDAL(string pMotivo, DateTime pFecha, bool pEsFeriadoDoble, int pIdFeriado)
        {
            if (0 < Adaptador.Actualizar(pMotivo, pFecha, pEsFeriadoDoble,pIdFeriado))
            {
                //Quito el objeto del cache para que no se tome otra vez con los datos viejos.
                CacheCA.Remove("Feriados");
                return true;
            }
            else
                return false;
        }
        public static void  Eliminar(int pId)
        {
            Adaptador.Eliminar(pId);
            CacheCA.Remove("Feriados");
        }
        protected static CA2FeriadoColeccion AsignarFeriadoTableAdapterAFeriadoColeccion(GestionHoraria.CAFeriadoDataTable pDataTable)
        {
            CA2FeriadoColeccion _Feriados = new CA2FeriadoColeccion();
            CA2Feriado _Feriado;

            if ((pDataTable != null)
                && (pDataTable.Rows.Count > 0))
            {
                foreach (GestionHoraria.CAFeriadoRow _row in pDataTable.Rows)
                {
                    _Feriado = AsignarRowAObjeto(_row);
                    if (_Feriado != null)
                        _Feriados.Add(_Feriado);
                }
            }
            return _Feriados;
        }
        public static CA2FeriadoColeccion ObtenerTodosLosFeriados()
        {
            GestionHoraria.CAFeriadoDataTable _dt = Adaptador.ObtenerTodosLosFeriados();

            return AsignarFeriadoTableAdapterAFeriadoColeccion(_dt);
        }
        public static CA2Feriado RecuperarPorFecha(DateTime pFecha)
        {
            pFecha = pFecha.Date; //le quito la hora x si la tiene(todos los feriados estan horas 12:00:00am

            /////////////////////////
            // Obtengo objeto desde el cache
            // Mantengo todos los feriados en el cache.
            CA2FeriadoColeccion _TodosLosFeriados = (CA2FeriadoColeccion)CacheCA["Feriados"]; // trato de obtenerlo del cache
            if (_TodosLosFeriados == null)
            {
                _TodosLosFeriados = ObtenerTodosLosFeriados();
                CacheCA.Insert("Feriados", _TodosLosFeriados, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(1, 0, 0));
            }

            foreach (CA2Feriado _feriado in _TodosLosFeriados)
                if (_feriado.Fecha.Date == pFecha.Date)
                    return _feriado;
            // Fin obtener de cache
            ///////////////////////////////////
            
            return null;
        }
        #endregion
    }
    public class CA2FeriadoColeccion : System.Collections.CollectionBase
    {
        public void Add(CA2Feriado pFeriado)
        {
            this.List.Add(pFeriado);
        }
        public void Remove(int index)
        {
            if (index <= Count - 1 || index >= 0)
            {
                this.List.RemoveAt(index);
            }
            else
            {
                throw new System.ArgumentException("Fuera de rango", "original");
            }
        }
        public CA2Feriado this[int index]
        {
            get { return ((CA2Feriado)(this.List[index])); }
            set { this.List[index] = value; }
        }
        public CA2FeriadoColeccion ObtenerTodosLosFeriados()
        {
            return CA2Feriado.ObtenerTodosLosFeriados();
        }
        public void EliminarFeriado(int idFeriado)
        {
            CA2Feriado.Eliminar(idFeriado);            
        }
        public static CA2Feriado RecuperarPorFecha(DateTime pFecha)
        {
            return CA2Feriado.RecuperarPorFecha(pFecha);
        }
        /// <summary>
        /// Asigna los valores del dataset a el objeto coleccion.
        /// </summary>
        /// <param name="pDSLegajos"></param>
        /// <returns></returns>
        //private CA2FeriadoColeccion AsignarDatasetAColeccion(DataSet pFeriadosDS)
        //{
        //    if ((pFeriadosDS == null) || (pFeriadosDS.Tables[0].Rows.Count == 0))
        //        return null;

        //    CA2FeriadoColeccion _resultado = new CA2FeriadoColeccion();
        //    CA2Feriado _feriado = new CA2Feriado(); //lo creo aca por que tengo que usar solamente un metodo que tiene 

        //    // recorro todas las filas y Feriado los objetos
        //    foreach (DataRow _row in pFeriadosDS.Tables[0].Rows)
        //    {
        //        // asigno los valores a el objeto y el objeto a la coleccion
        //        _resultado.Add(_feriado.AsignarRowAFeriado(_row));
        //    }

        //    return _resultado;

        //}
    }
}